package servlets;


import java.io.IOException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import main.java.aplicacion.ManejadorSistemaError;
import main.java.aplicacion.juegos.excepciones.JuegoError;
import main.java.aplicacion.systemfactory.SystemFactory;
import main.java.aplicacion.usuarios.excepciones.UsuarioError;
import main.java.datatypes.juegos.JuegoVO;
import main.java.datatypes.usuarios.ClienteVO;
import main.java.seguridad.excepciones.LogueadosError;
import main.java.seguridad.factory.loggedFactory;
import main.java.seguridad.interfaces.LogueadosMgt;
import main.java.datatypes.comentarios.ComentarioVO;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import java.io.*;



/**
 * Servlet implementation class Juego
 */
public class Juego extends HttpServlet {
	private static final long serialVersionUID = 1L;
    /**
     * Default constructor. 
     */
    public Juego() {
       super();
    }
    
    protected void altaJuego(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	
        try {	
        	String nombreJuego = "";
        	String numeroversion = "";
        	String precio = "";
        	String descripcion = "";
        	double tam = 0;
    		//Ruta donde se guardara el fichero

    		File destino = new File("/home/santiago/Desktop");
    		ServletRequestContext src = new ServletRequestContext(request);
     
    		if(ServletFileUpload.isMultipartContent(src)){
    			DiskFileItemFactory factory = new DiskFileItemFactory((1024*1024),destino);
    			ServletFileUpload upload = new  ServletFileUpload(factory);
     
    			List lista;
    			lista = upload.parseRequest(src);

    			File file = null;
    			Iterator it = lista.iterator();
    			
    			while(it.hasNext()){
    				FileItem item=(FileItem)it.next();
    				if(item.isFormField()){
    					if(item.getFieldName().equals("nombre")){
    						nombreJuego = item.getString();
    						System.out.println(nombreJuego);
    					}
    					else if(item.getFieldName().equals("numeroversion")){
    						numeroversion = item.getString();
    						System.out.println(numeroversion);
    					}
    					else if(item.getFieldName().equals("precio")){
    						precio = item.getString();
    						System.out.println(precio);
    					}
    					else if(item.getFieldName().equals("descripcion")){
    						descripcion = item.getString();
    						System.out.println(descripcion);
    					}
    				}
    				else
    				{
    					file=new File(nombreJuego+".v"+numeroversion+".jar");
    					item.write(new File(destino,nombreJuego+".v"+numeroversion+".jar"));
    					tam = item.getSize();
    					request.setAttribute("file", file);
    					//System.out.println(item.getSize());//bytes
    				} // end if
    			} // end while
    		} // end if
        JuegoVO juego = new JuegoVO(nombreJuego, descripcion, tam, Double.valueOf(precio).doubleValue());
        juego.setNumeroVersion(numeroversion);
        HttpSession objSesion = request.getSession();
        String nick = (String) objSesion.getAttribute("usuario");
        objSesion.setAttribute("nuevojuego", juego);
        objSesion.setAttribute("usuario", nick);
        /*************************/
        LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
        List<String> categorias = log.altaJuego(nombreJuego, tam, Double.valueOf(precio).doubleValue(), descripcion, nick);
        /************************/
        request.setAttribute("categorias", categorias);
	    RequestDispatcher dispatcher = request.getRequestDispatcher("/juegos/SeleccionarCategorias.jsp");
	    dispatcher.forward(request, response);
	       
        } 
        catch (NumberFormatException e)
        {
        	System.out.println("numero excepcion");
        	HttpSession objSesion = request.getSession();
        	objSesion.removeAttribute("nuevojuego");
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
        	dispatcher.forward(request, response);
        } 
        catch (ManejadorSistemaError e) 
        {
        	System.out.println("manejador sistema error");
        	HttpSession objSesion = request.getSession();
        	objSesion.removeAttribute("nuevojuego");
        	if(e.getError() == ManejadorSistemaError.TipoError.LISTA_CATEGORIAS_VACIA){System.out.println("manejador categorias vacia");}
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
        	dispatcher.forward(request, response);
        } 
        catch (JuegoError e) 
        {
        	System.out.println("juego error");
        	HttpSession objSesion = request.getSession();
        	objSesion.removeAttribute("nuevojuego");
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
        	dispatcher.forward(request, response);
        }
        catch (FileUploadException e) {
        	HttpSession objSesion = request.getSession();
        	objSesion.removeAttribute("nuevojuego");
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    		dispatcher.forward(request, response);
    		//System.out.println("Fichero subido");
    	}	
        catch (Exception e) {
        	HttpSession objSesion = request.getSession();
        	objSesion.removeAttribute("nuevojuego");
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    		dispatcher.forward(request, response);
    		System.out.println("Fichero subido");
    	} 
        catch (LogueadosError e) {
        	//HttpSession objSesion = request.getSession();
        	//objSesion.removeAttribute("nuevojuego");
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    		dispatcher.forward(request, response);
    		System.out.println("logueo mal");
    		if(e.getError() == LogueadosError.TipoError.NO_EXISTEN_LOGUEADOS){System.out.println("no existen logueados");}
    		if(e.getError() == LogueadosError.TipoError.CONTRASENA_INVALIDA){System.out.println("contraseña invalida");}
    		if(e.getError() == LogueadosError.TipoError.USUARIO_NO_LOGUEADO){System.out.println("no logueado");}
		}


    }
    
    protected void seleccionarCat(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
    		try{
    			HttpSession objSesion = request.getSession();
    			String nick = (String) objSesion.getAttribute("usuario");	
    			
    			List<String> categoriasJuego = new ArrayList<String>();
    			for(String c: request.getParameterValues("listaCategorias")){
    				categoriasJuego.add(c);
    			}
    			
    			JuegoVO j = (JuegoVO) objSesion.getAttribute("nuevojuego");    	
    			/**************************/
    			LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
    			log.seleccionarDesarrollador(nick, j.getNombre(), j.getDescripcion(), j.getTamano(), j.getPrecio(),categoriasJuego);
    			/********************/
    			objSesion.removeAttribute("nuevojuego");
    	        //version = null;
    			RequestDispatcher dispatcher = request.getRequestDispatcher("/login/login");
                dispatcher.forward(request, response);
    		}
            catch (UsuarioError e) 
            {
            	System.out.println("usuario error");
            	HttpSession objSesion = request.getSession();
            	objSesion.removeAttribute("nuevojuego");
    	        //version = null;
            	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
            	dispatcher.forward(request, response);
            	//File file = (File)request.getAttribute("file");
            	//file.delete();
            }
    		catch (JuegoError e) 
    		{
    			HttpSession objSesion = request.getSession();
    			objSesion.removeAttribute("nuevojuego");
    	        //version = null;
    			System.out.println("juego error");
    			RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    			dispatcher.forward(request, response);
            	//File file = (File)request.getAttribute("file");
            	//file.delete();
    		} 
    		catch (LogueadosError e) {
    			//HttpSession objSesion = request.getSession();
    			//objSesion.removeAttribute("nuevojuego");
    	        //version = null;
    			System.out.println("juego error");
    			RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    			dispatcher.forward(request, response);
			}     
    }
    

    /*protected void seleccionarJuegoAComprar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, LogueadosError {

 	   
    	CargarDatosPrueba dp = new CargarDatosPrueba();
    	dp.loadData();
    	
    	HttpSession objSesion = request.getSession();
        String nick = (String) objSesion.getAttribute("usuario");
    	
    	LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
        List<CompraJuegoVO> descJuegos = log.comprarJuego(nick);
       	
        	if(descJuegos.isEmpty()){
        		System.out.println("No hay juegos en el sistema");
            	RequestDispatcher dispatcher = request.getRequestDispatcher("/error.jsp");
            	dispatcher.forward(request, response);
        	}
        	else{
        	request.setAttribute("listaDescJuegos", descJuegos);
        	List<String> juegos = new ArrayList<String>();
        	for(String j: request.getParameterValues("listaDescJuegos")){
    			juegos.add(j);
    		}
    		String compra = juegos.get(0);
    		main.java.aplicacion.juegos.entidades.Juego j =log.find(compra);
    	    objSesion.setAttribute("juegoacomprar", j);
            RequestDispatcher dispatcher = request.getRequestDispatcher("/juegos/DatosCompra.jsp");
            dispatcher.forward(request, response);
           
            
    		
        	}
      }*/
    
	private void comentariosOrdenados(List<ComentarioVO> list, ComentarioVO com){
		list.add(com);
		if(com.getRespuestas() != null){
			for(ComentarioVO resp: com.getRespuestas()){
				comentariosOrdenados(list, resp);
			}
		}
	}	
 
   protected void infoJuego(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	try {
	    	LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
	    	String juegoSeleccionado = (String) request.getParameter("juegoseleccionado");
	    	HttpSession objSesion = request.getSession();
	    	boolean visitante = ((objSesion.getAttribute("usuario") == null) || (objSesion.getAttribute("usuario").equals(""))) ;
	    	String nick = (String) objSesion.getAttribute("usuario");
	    	objSesion.setAttribute("nombrejuego", juegoSeleccionado);

	    	JuegoVO juego = log.buscarJuego(juegoSeleccionado);	    	
	    	List<JuegoVO> juegoscomprados = new ArrayList<JuegoVO>();
	    	String link = "";
	    	Boolean yacompro = Boolean.FALSE;
	    	
	    	if( ( (!visitante) && (objSesion.getAttribute("desarrollador") != null ) && !((Boolean) objSesion.getAttribute("desarrollador")))){
	    		ClienteVO cvo = log.buscarCliente(nick);
	    		juegoscomprados = cvo.getJuegosAdquiridos() ;
	    		
	    		
	    		for(JuegoVO j : juegoscomprados){
	    			if(j.getNombre().equals(juegoSeleccionado)){
	    				link = log.getLinkJuego(juegoSeleccionado);
	    				yacompro = Boolean.TRUE;
		    			
	    			}	 
	    			
	    		}
	    	}
			//main.java.aplicacion.juegos.entidades.Juego ab = ManejadorSistema.getInstance().findJuego("Angry Birds");
			//JuegoVO abj = ab.getJuegoVO();
	
	    	
	    	
			List<ComentarioVO> comentarios = juego.getComentarios();
			List<ComentarioVO> ordenados = new ArrayList<ComentarioVO>();
			if(comentarios!=null){	
				for(ComentarioVO com: comentarios){
					if(com.getRespondeA() == 0){
						comentariosOrdenados(ordenados, com);
					}
				} 	
			}
			request.setAttribute("yacompro", yacompro);
			request.setAttribute("link", link);
			request.setAttribute("juegoscomprados", juegoscomprados);
			request.setAttribute("datajuego", juego);
			request.setAttribute("comentarios", ordenados);
			objSesion.setAttribute("juegoacomprar", juego);
	    	RequestDispatcher dispatcher = request.getRequestDispatcher("/juegos/infoJuego.jsp");
			dispatcher.forward(request, response);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       	
    } 

    
    protected void DatosCompra(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 	   
        HttpSession objSesion = request.getSession();
        JuegoVO j = (JuegoVO) objSesion.getAttribute("juegoacomprar");
        String nick = (String) objSesion.getAttribute("usuario");
        Date date = new Date(0);
        LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
        log.confirmarCompra(date, nick, j.getNombre());
        RequestDispatcher dispatcher = request.getRequestDispatcher("/login/login");
        dispatcher.forward(request, response);
    } 
/*
   protected void altaVersion(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	try {
    		HttpSession objSesion = request.getSession();
			String nick = (String) objSesion.getAttribute("usuario");
			
			LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
			List<String> juegos = log.listarJuegosAprobadosDesarrollador(nick);
			
			request.setAttribute("juegos", juegos);
			if(juegos.isEmpty()){
				System.out.println("no juegos");
	        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
	        	dispatcher.forward(request, response);
			}
			else{
				request.setAttribute("juegos", juegos);
	        	RequestDispatcher dispatcher = request.getRequestDispatcher("/juegos/AltaVersionJuego.jsp");
	        	dispatcher.forward(request, response);
			}

		} catch (UsuarioError e) {
        	System.out.println("no es desarrollador");
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
        	dispatcher.forward(request, response);
		} 
    	catch (LogueadosError e) {
    		System.out.println("logueo error");
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
        	dispatcher.forward(request, response);
		}		
    }*/
   
  /* protected void altaVersionJuego(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	   	String nombreJuego =request.getParameter("listaJuegos");
	    HttpSession objSesion = request.getSession();
	    objSesion.setAttribute("nombrejuego", nombreJuego);
   		RequestDispatcher dispatcher = request.getRequestDispatcher("/juegos/SubirVersion.jsp");
   		dispatcher.forward(request, response);
	   
   }*/
    
    protected void guardarVersion(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  
        try {		
        	
    		HttpSession objSesion = request.getSession();
			String nick = (String) objSesion.getAttribute("usuario");
			String nombreJuego = (String) objSesion.getAttribute("nombrejuego");
			objSesion.removeAttribute("nobrejuego");
			
    		//Ruta donde se guardara el fichero
    		File destino = new File("/home/constanza/Documentos");
    		ServletRequestContext src = new ServletRequestContext(request);
     
    		if(ServletFileUpload.isMultipartContent(src)){
    			DiskFileItemFactory factory = new DiskFileItemFactory((1024*1024),destino);
    			ServletFileUpload upload = new  ServletFileUpload(factory);
     
    			List lista;
    			lista = upload.parseRequest(src);

    			File file = null;
    			Iterator it = lista.iterator();
    			
    			double numeroVersion = 0;
    			String numero = "";
    			
    			while(it.hasNext()){
    				FileItem item=(FileItem)it.next();
    				if(item.isFormField()){
    					numero = item.getString();
    					numeroVersion = Double.valueOf(numero).doubleValue();
    					/*****************/
    					LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt(); 
    					boolean existeVersion = log.existeVersionPendienteAprobada(nombreJuego,numero, nick);
    					/*********************/
    					if(existeVersion){
    			    		RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    			    		dispatcher.forward(request, response);
    			    		System.out.println("Ya existe una version aprobado o rechazada de este juego");
    					}
    				}
    				else
    				{
    					System.out.println(item.getContentType());//application/x-java-archive
    					file=new File(nombreJuego+".v"+numeroVersion+".jar");
    					item.write(new File(destino,nombreJuego+".v"+numeroVersion+".jar"));
    					System.out.println(item.getSize());//bytes
    					SystemFactory.getInstance().getJuegoMgt().altaVersionJuego
    					(nombreJuego, numero/*numeroVersion*/, Double.valueOf(item.getSize()).doubleValue(), "/home/constanza/Documentos");
    					System.out.println("Fichero subido");

    					//}
    				} // end if
    			} // end while
    		} // end if
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/login/login");
            dispatcher.forward(request, response);
    	}
        catch (FileUploadException e) {
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    		dispatcher.forward(request, response);
    		//System.out.println("Fichero subido");
    	}	
        catch (Exception e) {
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    		dispatcher.forward(request, response);
    		System.out.println("Fichero subido");
    	} 
        catch (LogueadosError e) {
        	RequestDispatcher dispatcher = request.getRequestDispatcher("/hola.jsp");
    		dispatcher.forward(request, response);
		}
     
    }
    

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		if(request.getServletPath().equals("/juegos/juego")){
			altaJuego(request, response);
		}
		else if(request.getServletPath().equals("/juegos/comprarJuego")){
			DatosCompra(request, response);
		}
		else if(request.getServletPath().equals("/juegos/infoJuego")){
			infoJuego(request, response);
		}
		
}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//System.out.println(request.getServletPath());
		if(request.getServletPath().equals("/juegos/juego")){
			altaJuego(request, response);
		}
		else if(request.getServletPath().equals("/juegos/categoria")){
			seleccionarCat(request, response);
			//infoJuego(request, response);
		}
		/*else if(request.getServletPath().equals("/juegos/version")){
			altaVersion(request, response);
		}*/
		else if(request.getServletPath().equals("/juegos/guardar")){
			//altaVersionJuego(request, response);
		}
		else if(request.getServletPath().equals("/juegos/guardarversion")){
			guardarVersion(request, response);
		}
		else if(request.getServletPath().equals("/juegos/comprarJuego"))
		{
			DatosCompra(request, response);
		}
		else if(request.getServletPath().equals("/juegos/infojuego")){
			infoJuego(request, response);

		}
	
	}



}
